02.03 - Punteros
Lenguajes Estructurados
¿Qué son los punteros?
Un puntero es una variable que almacena la dirección de memoria de otra variable.
Los punteros permiten acceder y manipular indirectamente el contenido de otras variables en la memoria.
¿Cómo se declaran los punteros?
Para declarar un puntero, utilizamos el operador *
seguido del nombre de la variable.
int *p;
¿Cómo se inicializan los punteros?
Para inicializar un puntero, utilizamos el operador &
seguido del nombre de la variable.
int x = 5;
int *p = &x; // p es un puntero que apunta a la dirección de memoria de x
¿Cómo se accede al valor de una variable a través de un puntero?
Para acceder al valor de una variable a través de un puntero, utilizamos el operador *
.
int x = 5;
int *p = &x;
int y = *p;
¿Cómo se modifica el valor de una variable a través de un puntero?
Para modificar el valor de una variable a través de un puntero, utilizamos el operador *
.
int x = 5;
int *p = &x;
*p = 10;
¿Cómo se pasan punteros a funciones?
Para pasar un puntero a una función, utilizamos el operador *
en la declaración de la función.
void incrementar(int *p) {
*p = *p + 1;
}
Pasar argumentos por referencia con punteros
Los punteros se pueden utilizar para pasar argumentos a funciones "por referencia" en lugar de "por valor".
Al pasar un puntero a una función, la función puede modificar el valor de la variable original en lugar de trabajar con una copia local de la variable.
void incrementar(int *num) {
(*num)++;
}
int main() {
int x = 0;
incrementar(&x); // x ahora vale 1
¿Cómo se retorna un puntero de una función?
Para retornar un puntero de una función, utilizamos el operador *
en la declaración de la función.
int *maximo(int *p1, int *p2) {
if (*p1 > *p2) {
return p1;
} else {
return p2;
}
}
¿Cómo se pasan arreglos a funciones?
Para pasar un arreglo a una función, no es necesario utilizar el operador *
.
void imprimir_arreglo(int arreglo[], int tam) {
for (int i = 0; i < tam; i++) {
printf("%d ", arreglo[i]);
}
printf("\n");
}
¿Cómo se retorna un arreglo de una función?
Para retornar un arreglo de una función, no es necesario utilizar el operador *
.
int *maximos(int arreglo[], int tam) {
int *maximos = malloc(tam * sizeof(int));
for (int i = 0; i < tam; i++) {
maximos[i] = arreglo[i] * 2;
}
return maximos;
}
Ejemplo 1
Supongamos que tenemos una variable "x" y queremos modificar su valor en una función. Para hacer esto, podemos utilizar un puntero que apunte a la dirección de memoria de la variable "x".
Primero, definimos la variable "x" y la inicializamos con un valor.
int x = 10;
Luego, definimos una función llamada "modificar_valor" que toma un puntero como argumento. Dentro de la función, podemos modificar el valor de la variable a la que apunta el puntero utilizando el operador de indirección "*".
void modificar_valor(int *p) {
*p = 20;
}
Para llamar a la función, podemos pasarle la dirección de memoria de la variable "x" utilizando el operador de dirección "&".
modificar_valor(&x);
Después de llamar a la función, el valor de la variable "x" habrá cambiado a 20.
printf("Valor de x: %d\n", x);
Podemos utilizar punteros en combinación con estructuras para acceder y modificar los campos de la estructura.
Por ejemplo, supongamos que tenemos una estructura "Persona" que contiene los campos "nombre", "edad" y "altura". Podemos crear una variable "persona1" de tipo "Persona" y utilizar un puntero para acceder y modificar los campos de la estructura.
struct Persona {
char nombre[50];
int edad;
float altura;
};
struct Persona persona1 = {"Juan", 30, 1.75};
struct Persona *p = &persona1;
(*p).edad = 35;
p->altura = 1.80;
En este ejemplo, creamos un puntero "p" que apunta a la dirección de memoria de la variable "persona1". Luego, utilizamos el operador de indirección "*" para acceder al contenido de la estructura y el operador de flecha "->" para acceder a los campos de la estructura.
Ejemplo 2
Invertir una cadena de caracteres utilizando punteros.
#include <stdio.h>
#include <string.h>
void swap(char *a, char *b) {
char temp = *a;
*a = *b;
*b = temp;
}
void invertirCadena(char *cadena) {
int n = strlen(cadena);
for (int i = 0; i < n / 2; ++i) {
swap(&cadena[i], &cadena[n - i - 1]);
}
}
int main() {
char cadena[] = "Ingeniería";
printf("Cadena original: %s\n", cadena);
invertirCadena(cadena);
printf("Cadena invertida: %s\n", cadena);
return 0;
}
Este ejemplo muestra cómo se pueden utilizar punteros para manipular y modificar una cadena de caracteres.
Se usan punteros para pasar caracteres individuales a la función swap, que intercambia dos caracteres.
La función invertirCadena utiliza punteros para acceder y modificar los caracteres en la cadena original.